 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-

# Agents 链接其他的数据源和计算资源
# 可以链接到自己的数据源，API 和自己的数据
from dotenv import load_dotenv, find_dotenv
# read local .env file
_ = load_dotenv(find_dotenv()) 

from langchain.chat_models import ChatOpenAi
llm = ChatOpenAi(temperature = 0.0)

import warnings
warnings.filterwarnings('ignore')

from langchain.agents import AgentType
from langchain.agents import load_tools, initialize_agent
from langchain.agents.agent_toolkit import creat_python_agent
from langchain.python import PythonREPL
from langchain.tools.python.tool import PythonREPLTool

# 加载了两个工具；一个是llm 数学工具，一个是维基百科工具
# 数学工具 实际上是一个chain， 使用语言模型和计算器来解决数学问题
# 维基百科工具 链接到维基百科api，允许对维基百科进行查询并返回结果
tools = load_tools(['llm-math','wikipedia'], llm = llm)

# 初始化一个代理
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    handle_parsing_error=True,
    verbose=True
)

agent("what is the 25% of 300")

result = agent("樊登曾是著名央视主持人，现樊登读书会创始人；樊登都写过哪些书？")

#REPL 是一种与代码进行交互的方式
agent1 = creat_python_agent(
    llm,
    agent=PythonREPLTool(),
    verbose=True
)

#给出了一列名字，然后排序
customer_list = [["Harrson","Chase"],
                 ["lang","chain"],
                 ["Elle","Elem"],
                 ["Geoff","Fusion"]]

agent1.run(f"""sort these customer by last name and then first name 
           and print the out put:{customer_list}""")

# agent1 run出来的结果（打印出来的output），会被反馈给语言模型，这样模型就可以推理刚刚运行的代码


# 创建另外一个工具，告诉我们当前时间是多少
from langchain.agents import tool
from datetime import date

@tool
def time(text : str) -> str:
    """Returns todays date, use this for any questions related to knowning todays date.
     The input should always be an empty string, and this function will always returns todays date
     - Any date mathmatics will occur out this function"""
    return str(date.today())

# 初始化一个代理
agent2 = initialize_agent(
    tools + [time],
    llm,
    agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
    handle_parsing_error=True,
    verbose=True
)

agent2.run("what is the date today?")